package com.divemotor.ventarepuestosinternet.controller;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;

import com.divemotor.ventarepuestosinternet.exception.DivemotorBusinessException;
import com.divemotor.ventarepuestosinternet.model.Cliente;
import com.divemotor.ventarepuestosinternet.model.TipoDocumento;
import com.divemotor.ventarepuestosinternet.model.Usuario;
import com.divemotor.ventarepuestosinternet.model.UsuarioCliente;
import com.divemotor.ventarepuestosinternet.service.CotizacionService;
import com.divemotor.ventarepuestosinternet.service.UsuarioClienteService;
import com.divemotor.ventarepuestosinternet.util.Constantes;
import com.divemotor.ventarepuestosinternet.util.DatosDeSession;
import com.divemotor.ventarepuestosinternet.util.Encriptacion;
import com.divemotor.ventarepuestosinternet.util.FacesContextUtil;

@ManagedBean(name="clienteUsuarioController")
@SessionScoped
public class ClienteUsuarioController implements  Serializable {

	private static final Logger logger = Logger.getLogger(CotizacionController.class);	
	private static final long serialVersionUID = -1378914647487417517L;
	
	@ManagedProperty(value = "#{usuarioClienteService}")
	private UsuarioClienteService usuarioClienteService;
	@ManagedProperty(value = "#{cotizacionService}")
	private CotizacionService cotizacionService;
	
	private Usuario usuario; 
	private UsuarioCliente usuarioCliente;
	private Boolean cambiarContrasenia;
	private String repetirContrasenia;
	private String idCliente;
	private String nombreCliente;
	private List<TipoDocumento> listaTipoDocumentos;
	
	public ClienteUsuarioController(){
	}
	
	@PostConstruct
	void init(){
		logger.info("PostConstruct");
		listarTiposDeDocumentos();		
		cargarDatosUsuario();
	}
	
	public void listarTiposDeDocumentos() {
		logger.info("listarTiposDeDocumentos");
		try {
			listaTipoDocumentos = usuarioClienteService.listarTipoDocumento();
		} catch (DivemotorBusinessException e) {			
			logger.error("EX* DivemotorBusinessException: " + e.getMessage());
		}
	}
	
	public void cargarDatosUsuario(){
		logger.info("cargarDatos");
		try {
			usuarioCliente  = usuarioClienteService.obtenerUsuarioClientePorUsuario(DatosDeSession.obtenerUsuarioAutenticado());
			usuario 	    = usuarioCliente.getUsuario();
			Cliente cliente = usuarioCliente.getCliente();
			idCliente		= cliente.getIdCliente();
			nombreCliente	= cliente.getNombre();
		} catch (DivemotorBusinessException e) {
			usuario 	   = new Usuario();
			usuarioCliente = new UsuarioCliente();
			logger.error("EX* listarTiposDeDocumentos: " + e.getMessage());
		}
	}
	
	public void recargarDatos(){
		logger.info("recargarDatos");
		cargarDatosUsuario();
	}
	
	public void actualizarDatosContacto(){
		
		if (StringUtils.isNotBlank(usuario.getCorreo())) {
			actualizarDatosGenerales();
		}else {
			RequestContext.getCurrentInstance(). addCallbackParam("correoVacio", true);
		}
	}
		
	private String validarDatosUsuario(){
		String mensajeValidacion = null;
		
		if(cambiarContrasenia){
			if(!usuario.getContrasenia().equals(repetirContrasenia)){
				mensajeValidacion = Constantes.MSJ_CONTRASENIAS_DIFERENTES;
			} 
		}
		
		if(StringUtils.isBlank(usuarioCliente.getTelefonoFijo()) && StringUtils.isBlank(usuarioCliente.getTelefonoRpc())
	    		&&  StringUtils.isBlank(usuarioCliente.getTelefonoRpm()) && StringUtils.isBlank(usuarioCliente.getTelefonoNextel())){
			mensajeValidacion = Constantes.MSJ_SIN_TELEFONOS;
		}
		
		return mensajeValidacion;
	}
	
	public void actualizarDatosGenerales(){		
		logger.info("Controller actualizarDatosContacto");
		try {
			String mensajeInfo = validarDatosUsuario();
			
			if(mensajeInfo == null){
				if(cambiarContrasenia){
					usuario.setContrasenia(Encriptacion.encriptarMD5(usuario.getContrasenia()));
				}
				
				usuarioCliente.setUsuario(usuario);
				cotizacionService.actualizarUsuarioDeCliente(usuarioCliente);				
				mensajeInfo = Constantes.MSJ_USUARIO_ACTUALIZADO_OK;
				FacesContextUtil.info("Mensaje", mensajeInfo);
			} else {
				FacesContextUtil.error(mensajeInfo);
			}
			
		} catch (DivemotorBusinessException e) {
			logger.error("EX* actualizarDatosGenerales DivemotorBusinessException: " + e.getMessage());
			FacesContextUtil.warn(e.getMessage());
		} catch (Exception e) {
			logger.error("EX* actualizarDatosGenerales Exception: " + e.getMessage());
			FacesContextUtil.error(Constantes.MSJ_ERROR_SISTEMA);
		}
	}

	public void setUsuarioClienteService(UsuarioClienteService usuarioClienteService) {
		this.usuarioClienteService = usuarioClienteService;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public UsuarioCliente getUsuarioCliente() {
		return usuarioCliente;
	}

	public void setUsuarioCliente(UsuarioCliente usuarioCliente) {
		this.usuarioCliente = usuarioCliente;
	}

	public Boolean getCambiarContrasenia() {
		return cambiarContrasenia;
	}

	public void setCambiarContrasenia(Boolean cambiarContrasenia) {
		this.cambiarContrasenia = cambiarContrasenia;
	}

	public String getRepetirContrasenia() {
		return repetirContrasenia;
	}

	public void setRepetirContrasenia(String repetirContrasenia) {
		this.repetirContrasenia = repetirContrasenia;
	}

	public String getIdCliente() {
		return idCliente;
	}

	public void setIdCliente(String idCliente) {
		this.idCliente = idCliente;
	}

	public void setCotizacionService(CotizacionService cotizacionService) {
		this.cotizacionService = cotizacionService;
	}

	public List<TipoDocumento> getListaTipoDocumentos() {
		return listaTipoDocumentos;
	}

	public void setListaTipoDocumentos(List<TipoDocumento> listaTipoDocumentos) {
		this.listaTipoDocumentos = listaTipoDocumentos;
	}

	public String getNombreCliente() {
		return nombreCliente;
	}
	
}
